package com.shejimoshi.单例模式.双重检索;

/**
 * 优点： 线程安全， 延迟加载，效率高
 *        由于JVM具有指令重排的特性， 在多线程环境下可能出现singleton已经赋值但是还没初始化的情况，导致一个线程获得还没初始化的实例
 *        volatile关键字的作用：
 *        保证了不同线程对这个变量进行操作时的可见性
 *        禁止进行指令重排
 */
public class Singleton {
    // 注意：这里用volatile修饰
    private static volatile Singleton singleton;

    private Singleton() {};

    public static Singleton getInstance() {
        if(null == singleton) {
            synchronized(Singleton.class) {
                if(null == singleton) {
                    singleton = new Singleton();
                }
            }
        }

        return singleton;
    }
}
